package com.zzh.partnersys.common.util;

import com.zzh.partnersys.common.exception.BusinessException;
import com.zzh.partnersys.common.exception.ResultCodeEnum;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

/**
 * Token 工具类
 * 用于从 HttpServletRequest 的请求头中获取用户信息
 * 适用于微服务架构，使用 JWT Token 进行认证
 *
 * @author zzh
 */
@Slf4j
public class TokenUtils {

    /**
     * Token 请求头名称
     */
    private static final String TOKEN_HEADER = "Authorization";
    
    /**
     * Token 前缀
     */
    private static final String TOKEN_PREFIX = "Bearer ";

    /**
     * 从请求头中获取 Token
     *
     * @param request HttpServletRequest
     * @return Token，如果不存在返回 null
     */
    public static String getToken(HttpServletRequest request) {
        if (request == null) {
            return null;
        }
        
        // 从 Authorization 请求头中获取 Token
        String authHeader = request.getHeader(TOKEN_HEADER);
        if (StringUtils.hasText(authHeader) && authHeader.startsWith(TOKEN_PREFIX)) {
            return authHeader.substring(TOKEN_PREFIX.length());
        }
        
        return null;
    }

    /**
     * 从请求头中获取当前登录用户的ID
     *
     * @param request HttpServletRequest
     * @return 用户ID，如果未登录或 Token 无效返回 null
     */
    public static Long getCurrentUserId(HttpServletRequest request) {
        String token = getToken(request);
        if (token == null) {
            return null;
        }
        return JwtUtil.getUserIdFromToken(token);
    }

    /**
     * 从请求头中获取当前登录用户的ID，如果未登录则抛出异常
     *
     * @param request HttpServletRequest
     * @return 用户ID
     * @throws BusinessException 如果未登录或 Token 无效
     */
    public static Long getCurrentUserIdOrThrow(HttpServletRequest request) {
        Long userId = getCurrentUserId(request);
        if (userId == null || userId <= 0) {
            throw new BusinessException(ResultCodeEnum.LOGIN_AUTH);
        }
        return userId;
    }

    /**
     * 判断当前用户是否已登录
     *
     * @param request HttpServletRequest
     * @return true 表示已登录，false 表示未登录
     */
    public static boolean isLogin(HttpServletRequest request) {
        String token = getToken(request);
        if (token == null) {
            return false;
        }
        return JwtUtil.validateToken(token);
    }

    /**
     * 验证 Token 是否有效
     *
     * @param request HttpServletRequest
     * @return true 表示 Token 有效，false 表示无效
     */
    public static boolean validateToken(HttpServletRequest request) {
        String token = getToken(request);
        if (token == null) {
            return false;
        }
        return JwtUtil.validateToken(token);
    }
}

